package bosque.unc.simulador;

import java.util.logging.Level;

import bosque.unc.Funciones;
import bosque.unc.enumerations.Direccion;



public class Automatico extends Thread
{
	private Integer delayCupulaVelLenta  = 400;
	private Integer delayCupulaVelNormal = 200;
	private Integer delayEncoder = 5;
	private Integer delayCupula = 100;
	private Integer delayPlataf = 100;
	private Simulador simulador;
	private Sentido sentido = Sentido.HORARIO;
	private Movimiento movimiento;
	private boolean auto = true;
	private Integer paso = 1;
	
	public Automatico(Simulador s, Movimiento m)
	{
		this.simulador = s;
		this.movimiento = m;
	}
	
	public void run()
	{
		Integer valorLeidoCupula = 0;
		Integer valorAEscribirCupula = 0;
		Integer valorLeidoPlatARAB = 0;
		Integer valorLeidoPlatADAF = 0;
		Integer valorAEscribirPlatARAB = 0;
		Integer valorAEscribirPlatADAF = 0;
		switch(movimiento)
		{
		case CUPULA:
			
			while(this.simulador.getAutoMode())
			{
				try {
					valorLeidoCupula = Integer.parseInt( this.simulador.getTextCupula().getText());
					this.delayCupula = (this.simulador.getScoba().getCupula().isVelLenta()) ? 
							delayCupulaVelLenta : delayCupulaVelNormal;
				} catch (NumberFormatException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(this.simulador.getScoba().getCupula().getDireccion().equals(Direccion.IZQUIERDA))
				{					
					if(valorLeidoCupula >= 255)
					{
						valorLeidoCupula = 255;
						valorAEscribirCupula = valorLeidoCupula;
					}
					else
						valorAEscribirCupula = valorLeidoCupula + 1;
					
					//System.out.println(valorAEscribir);
					this.simulador.getTextCupula().setText(String.format("%d", valorAEscribirCupula));
					this.simulador.updateCupula10b();
				}
				
				else if(this.simulador.getScoba().getCupula().getDireccion().equals(Direccion.DERECHA))
				{
										
					if(valorLeidoCupula<=0)
					{
						valorLeidoCupula = 0	;
						valorAEscribirCupula = valorLeidoCupula;
					}
					else						
						valorAEscribirCupula = valorLeidoCupula - 1;
					//System.out.println(valorAEscribir);
					this.simulador.getTextCupula().setText(String.format("%d", valorAEscribirCupula));
					this.simulador.updateCupula10b();
				}
				
				else
				{
					
				}
				
				try {
					sleep(this.delayCupula);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			break;
		case ENCODER:
									
			while(this.simulador.getAutoMode())				
			{				
				Direccion direccion = simulador.getScoba().getTelescopio().getDireccion();
				
				switch (direccion)
				{
				case OESTE:
					sentido = Sentido.HORARIO;
					break;
				case ESTE:
					sentido = Sentido.ANTIHORARIO;
					break;
				case NORTE:
					sentido = Sentido.HORARIO;
					
					break;			
				case SUR:
					sentido = Sentido.ANTIHORARIO;
					break;
				case PARADO:
					break;
				default:
					break;
				}
				
				if(direccion.equals(Direccion.ESTE) || direccion.equals(Direccion.OESTE))
				{
					Integer grados  = simulador.getEncoderAlfa().getGrados();
					simulador.getEncoderAlfa().incrementar(sentido,this.calcularPasos());
					simulador.getEncoderAlfa().calcularGradMinSeg();
					//simulador.getTextAlfaSeg().setText(String.format("%02d", simulador.getEncoderAlfa().getSegundos()));
					//simulador.getTextAlfaMin().setText(String.format("%02d", simulador.getEncoderAlfa().getMinutos()));
					//simulador.getTextAlfaGrad().setText(String.format("%03d", Math.abs( grados)));
					//simulador.getTextAlfaSign().setText( (simulador.getEncoderAlfa().getSigno().equals(-1)) ? "-" : "");

					//System.out.println(grados);
					
				}
				
				else if(direccion.equals(Direccion.NORTE) || direccion.equals(Direccion.SUR))
				{
					Integer grados  = simulador.getEncoderDelta().getGrados();
					simulador.getEncoderDelta().incrementar(sentido,this.calcularPasos());
					simulador.getEncoderDelta().calcularGradMinSeg();
					//simulador.getTextDeltaSeg().setText(String.format("%02d", simulador.getEncoderDelta().getSegundos()));
					//simulador.getTextDeltaMin().setText(String.format("%02d", simulador.getEncoderDelta().getMinutos()));
					//simulador.getTextDeltaGrad().setText(String.format("%03d", Math.abs(grados)));
					//simulador.getTextDeltaSign().setText( (simulador.getEncoderDelta().getSigno().equals(-1)) ? "-" : " ");
					if(!simulador.getEncoderDelta().getSigno().equals(-1))
					{
						//Funciones.log(Level.SEVERE, "signo encoder: " + simulador.getEncoderDelta().getSigno());
						//Funciones.log(Level.SEVERE, "label: " + simulador.getTextDeltaSign().getText());
					}
				}
				else
				{
					
				}
				
				
				try
				{
					Thread.sleep(delayEncoder);
				} catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			
				
			}
			break;
		case PLATAFORMA:
			while(this.simulador.getAutoMode())
			{
				try {
					valorLeidoPlatARAB = Integer.parseInt( this.simulador.getTextPlatARAB().getText());
					valorLeidoPlatADAF = Integer.parseInt( this.simulador.getTextPlatADAF().getText());
					
				} catch (NumberFormatException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				if(this.simulador.getScoba().getPlataforma().getDireccion().equals(Direccion.ABAJO))
				{
					if(valorLeidoPlatARAB >= 255)
					{
						valorLeidoPlatARAB = 255;
						valorAEscribirPlatARAB = valorLeidoPlatARAB;
					}
					else
						valorAEscribirPlatARAB = valorLeidoPlatARAB + 1;
					
					//System.out.println(valorAEscribir);
					this.simulador.getTextPlatARAB().setText(String.format("%d", valorAEscribirPlatARAB));
					
				}
				
				else if(this.simulador.getScoba().getPlataforma().getDireccion().equals(Direccion.ARRIBA))
				{
					if(valorLeidoPlatARAB  <= 0)
					{
						valorLeidoPlatARAB = 0;
						valorAEscribirPlatARAB = valorLeidoPlatARAB;
					}
					else
						valorAEscribirPlatARAB = valorLeidoPlatARAB - 1;
					
					//System.out.println(valorAEscribir);
					this.simulador.getTextPlatARAB().setText(String.format("%d", valorAEscribirPlatARAB));
					
				}
				
				else if(this.simulador.getScoba().getPlataforma().getDireccion().equals(Direccion.AFUERA))
				{
					if(valorLeidoPlatADAF  >= 255)
					{
						valorLeidoPlatADAF = 255;
						valorAEscribirPlatADAF = valorLeidoPlatADAF;
					}
					else
						valorAEscribirPlatADAF = valorLeidoPlatADAF + 1;
					
					//System.out.println(valorAEscribir);
					this.simulador.getTextPlatADAF().setText(String.format("%d", valorAEscribirPlatADAF));
					
				}
				
				else if(this.simulador.getScoba().getPlataforma().getDireccion().equals(Direccion.ADENTRO))
				{
					if(valorLeidoPlatADAF  <= 0)
					{
						valorLeidoPlatADAF = 0;
						valorAEscribirPlatADAF = valorLeidoPlatADAF;
					}
					else
						valorAEscribirPlatADAF = valorLeidoPlatADAF - 1;
					
					//System.out.println(valorAEscribir);
					this.simulador.getTextPlatADAF().setText(String.format("%d", valorAEscribirPlatADAF));
					
				}
				
				else
				{
					
				}
				
				try {
					sleep(this.delayPlataf);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				
			}
			break;
		default:
			break;
		
		}
		
		
		
		
		
	}
	
	/**
	 * Genera un delay de acuerdo a la velocidad del movimiento del telescopio
	 * @return
	 */
	private Integer getDalayFromVelTel()
	{
		Integer delay = 10;
		Integer velMov = this.simulador.getScoba().getTelescopio().getVelMov();
		
		
		
		return delay;
	}

	public Integer getDelay() {
		return delayEncoder;
	}

	public void setDelay(Integer delay) {
		this.delayEncoder = delay;
	}

	public Simulador getSimulador() {
		return simulador;
	}

	public void setSimulador(Simulador simulador) {
		this.simulador = simulador;
	}

	public boolean isAuto() {
		return auto;
	}

	public void setAuto(boolean auto) {
		this.auto = auto;
	}

	public Integer getDelayEncoder() {
		return delayEncoder;
	}

	public void setDelayEncoder(Integer delayEncoder) {
		this.delayEncoder = delayEncoder;
	}

	public Integer getDelayCupula() {
		return delayCupula;
	}

	public void setDelayCupula(Integer delayCupula) {
		this.delayCupula = delayCupula;
	}

	public Integer getDelayPlataf() {
		return delayPlataf;
	}

	public void setDelayPlataf(Integer delayPlataf) {
		this.delayPlataf = delayPlataf;
	}

	public Movimiento getMovimiento() {
		return movimiento;
	}

	public void setMovimiento(Movimiento movimiento) {
		this.movimiento = movimiento;
	}

	public Integer getDelayCupulaVelLenta() {
		return delayCupulaVelLenta;
	}

	public void setDelayCupulaVelLenta(Integer delayCupulaVelLenta) {
		this.delayCupulaVelLenta = delayCupulaVelLenta;
	}

	public Integer getDelayCupulaVelNormal() {
		return delayCupulaVelNormal;
	}

	public void setDelayCupulaVelNormal(Integer delayCupulaVelNormal) {
		this.delayCupulaVelNormal = delayCupulaVelNormal;
	}

	public Sentido getSentido() {
		return sentido;
	}

	public void setSentido(Sentido sentido) {
		this.sentido = sentido;
	}

	public Integer getPaso() {
		return paso;
	}

	public void setPaso(Integer paso) {
		this.paso = paso;
	}
	
	/**
	 * Calcula la velocidad para incrementar los encoders. Incluye el paso y el delayEncoder 
	 */
	public Integer calcularPasos()
	{
		Double a, b, pasos;
		// y = ax+b; vel=a*pasos+b
		Integer pasosMax = 60;
		Integer pasosMin = 1;
		
		if(simulador.getScoba().getTelescopio().isCalado())
		{
			 pasosMax = 60;
			 pasosMin = 1;
			 this.delayEncoder = 5;
		}
		else
		{
			 pasosMax =  8;
			 pasosMin = 1;
			 this.delayEncoder = 10;
		}
		
		
		Integer velMax = simulador.getScoba().getTelescopio().getRampaValMaxManopla();
		Integer velMin = simulador.getScoba().getTelescopio().getRampaValMinManopla();
		Integer velMov = simulador.getScoba().getTelescopio().getVelMov();
		a = (velMax.doubleValue() - velMin.doubleValue()) / (pasosMax.doubleValue() - pasosMin.doubleValue());
		b = (velMax.doubleValue() - (velMax.doubleValue()-velMin.doubleValue()))/pasosMin.doubleValue();
		pasos = (velMov - b)/ a;
		
		
		//Integer pasos = 0;
		
		Integer cantPasos = pasos.intValue();
		cantPasos = (cantPasos < 1) ? 1 : cantPasos;
		//System.out.println(cantPasos);
		return cantPasos;
		
		
	}
	
}
